package org.thanos.demo;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 整合SpringBoot基准测试
 */
@State(Scope.Thread)
public class JmhApplication {

    //指定全局变量
    private ConfigurableApplicationContext context;

    public static void main(String[] args) throws RunnerException {
        //include:指定当前这个类执行options的操作 如果你有多个options不指定其它也会执行
        Options options = new OptionsBuilder().include(JmhApplication.class.getName() + ".*")
                .warmupIterations(2).measurementIterations(2)
                .forks(1).build();
        new Runner(options).run();
    }

    /**
     * Setup初始化容器的时候只执行一次
     */
    @Setup(Level.Trial)//测试级别 执行一次
    public void init() {
        String args = "";
        context = new SpringApplicationBuilder(JmhApplication.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }

    /**
     * Benchmark执行多次，此注解代表触发我们所要进行基准测试的方法
     */
    @Benchmark
    public void test() {
        System.out.println(context.getEnvironment().getSystemEnvironment());
    }
}
